#ifndef LOGGER_H_
#define LOGGER_H_

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <stdarg.h>
#include <string.h>
#include <pthread.h>
#include <time.h>
#include <typeinfo>
#include "properties.h"

#define SIZE 1024

static const string CONFIG_FILE_NAME = "logger.properties";

typedef enum log_level {LOG_FATAL, LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG} LOG_LEVEL;

using namespace std;

class Logger {

public:
	static Logger & getLoggerInstance();
	~Logger();

	//Metodos de logeo
	void debug(const char *, ...);
	void info(const char *, ...);
	void warn(const char *, ...);
	void error(const char *, ...);
	void fatal(const char *, ...);

private:
	/* Variables miembro */
	ofstream loggerFile;		//Archivo de logeo

	//Mutex
	pthread_mutex_t mutex;		// Mutex

	//Propiedades del logger
	string fileName;			//Nombre del archivo del log
	string pattern;				//Patron de logueo de fecha hora
	int debugLevel;			//Nivel de logeo

	/* Metodos */
	char *printTime(void);		//Imprime fecha y hora
	bool openLogger(void);		//Abre el archivo de log
	bool closeLogger(void);		//Cierra el archivo de log
	int getIntegerDebugLevel(const string &logLevel);

	/* Constructores y sobrecargas */
	Logger(); 								//Constructor por defecto
	Logger(const Logger &);					//Constructor por copia --No implementado
	Logger & operator = (const Logger &); 	//Sobrecarga operador "="

};

#endif /* LOGGER_H_ */
